// 引入必要的过程宏库
use proc_macro::TokenStream;
use quote::quote;
use proc_macro::TokenTree;

// 定义函数宏
#[proc_macro]
pub fn array(input: TokenStream) -> TokenStream {
    // 打印整个 input 的内容
    //println!("Macro input (raw): {:?}", input);

    // 打印 input 中的每个 token
    println!("工程师在代码中输入的内容如下:");
    for (index, token) in input.clone().into_iter().enumerate() {
        //如果token是Literal,那么打印token.symbol
        //如果token是Punct,那么打印token.ch
        match token {
            TokenTree::Literal(lit) => println!("Token {}  - Literal: {}",index, lit.to_string()),
            TokenTree::Punct(punct) => println!("Token {}  - Punctuation: '{}'",index, punct.as_char()),
            _ => (),
        }
    }

    // 将 input 转换为迭代器
    let mut iter = input.into_iter();
    
    // 第一个参数：待分割的字符串
    let content = loop {
        match iter.next() {
            Some(TokenTree::Literal(lit)) => {
                // 找到字面量后返回
                let content_str = lit.to_string().trim_matches('"').to_string();
                println!("Parsed content: {}", content_str);
                break content_str;
            },
            Some(TokenTree::Punct(_)) => {
                // 遇到标点符号就继续循环
                continue;
            },
            None => panic!("未找到字符串参数"),
            _ => panic!("第一个参数必须是字符串"),
        }
    };

    // 第二个参数：分隔符
    let delimiter = loop {
        match iter.next() {
            Some(TokenTree::Literal(lit)) => {
                // 找到字面量后返回
                let delimiter_str = lit.to_string().trim_matches('"').to_string();
                println!("Parsed delimiter: {}", delimiter_str);
                break delimiter_str;
            },
            Some(TokenTree::Punct(_)) => {
                // 遇到标点符号就继续循环
                continue;
            },
            None => panic!("未找到分隔符参数"),
            _ => panic!("第二个参数必须是分隔符字符串"),
        }
    };

    // 分割字符串
    let elements: Vec<String> = content
        .split(&delimiter)
        .map(|s| s.trim().to_string())
        .collect();

    // 打印分割后的元素
    println!("Parsed elements: {:?}", elements);

    // 使用 quote! 宏生成代码
    let expanded = quote! {
        [#(#elements),*]
    };

    // 转换为 TokenStream 并返回
    TokenStream::from(expanded)
}